package java学习.第07章_面向对象编程_进阶;

import java.time.LocalDateTime;

/**
 * ClassName: D_关键字之super
 * Package: java学习.第07章_面向对象编程_进阶
 * Description:
 *
 * @Author 张蛟龙
 * @Create 2023/3/6 19:44
 * @Version 1.0
 */
public class D_关键字之super {
    /**
     *  最近原则
     * super  直接从父类中寻找
     * 如果 父类的方法子类重写了，想要调用，
     * 就要 super.方法名() //直接丛父类找这个方法
     *
     * 如果子类和父类的属性相同时
     *      最近原则，要想调用父类的属性，需要 super.属性
     * 子类的构造器会默认调用父类的构造器
     *      这也是，子类拥有父类所用属性和方法的原因
     * 因为子类一定会先调用父类构造器，所以，都是先加载 Object 再往下移
     */
    public static void main(String[] args) {

        DB db = new DB();
        db.DDD();

        DA db1 = new DB();//这叫多态
        db1.DDD();//方法引用的是 前面的方法，
        // 但是实现是 new 后的方法
        System.out.println(db1.id);//但是属性却用的是前者的属性值
    }
}
class DAA{
    public DAA(){
        System.out.println("祖类构造器");
    }
    public DAA(int a){
        System.out.println("祖类构造器");
    }
    public int id = 0;
    public void DDD(){
        System.out.println("祖类");
    }
}
class DA extends DAA{
    public DA(){
        //他的子类构造器默认会调用父类的 空参构造器
        System.out.println("父类构造器");
    }
    public int id = 1;
    public void DDD(){
        System.out.println("父类方法");
    }
}
class DB extends DA{
    public DB(){
        super();//默认调用父类空参构造器 所以不主动调用也会执行
        System.out.println("子类构造器");
    }
    public int id = 2;
    public void DDD(){
//        DDD();//前面什么都不加默认 this
//        super.DDD();//调用父类的方法
        System.out.println("子类方法");
    }
}